package cn.lzy.demo;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

/**
 * @Description
 * @Author lzy
 * @Date 2023/12/19 15:05
 * @Version
 **/
@Aspect
@Component
public class TimeLogAspect {

    /**
     * 切点
     * （拦截在方法上含有注解 @TimeLog 或 类上含有注解 @TimeLog 的方法或类）
     * 【注意】
     *   @annotation(TimeLog) 只是检查方法上是否存在 TimeLog 注解
     *   @within(TimeLog) 表示类上有 TimeLog 注解，则类中的方法会被拦截下来
     */
    @Pointcut("@annotation(TimeLog) || @within(TimeLog)")
    public void pc() {

    }


    @Around("pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.currentTimeMillis();
        // 这行代码表示执行目标方法
        Object result = pjp.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println(pjp.getSignature().getName() + "方法执行耗时：" + (endTime - startTime) + "毫秒");
        return result;
    }

}
